#pragma once

#include "FITKInterfaceCustomDataAPI.h"
#include "FITK_Kernel/FITKCore/FITKAbstractNDataObject.h"
#include "FITK_Kernel/FITKCore/FITKVarientParams.h"
#include "FITK_Kernel/FITKCore/FITKAbstractDataManager.hpp"

namespace Interface
{
	class FITKInterfaceCustomDataAPI FITKCDDataSolid : public Core::FITKAbstractNDataObject, public Core::FITKVarientParams
    {
    public:
        explicit FITKCDDataSolid() = default;
        virtual ~FITKCDDataSolid() = default;

		// SET
		void setSolid_Type(int nVal);
		void setMaterial(int nVal);
		void setDensity(int nVal);
		void setRigid_Type(int nVal);
		void setMass(double dVal);
		void setCustom_Defined_Inertia_Matrix(bool bVal);
		void setCentroid(double* dVal);
		void setInertia_Matrix_xx(double nVal);
		void setInertia_Matrix_yy(double nVal);
		void setInertia_Matrix_zz(double nVal);
		void setInertia_Matrix_xy(double nVal);
		void setInertia_Matrix_xz(double nVal);
		void setInertia_Matrix_yz(double nVal);
		void setLinear_Velocity(double* dVal);
		void setAngular_Velocity(double* dVal);
		void setInitial_Euler_Angles(double* dVal);

		void setType_of_Element(int nVal);
		void setIn_or_Out_Normalvector(int dVal);
		void setSpecified_Axis(double* dVal);
		void setConstrain_DOF(bool bVal);
		void setFreeze_Movement_X(bool bVal);
		void setFreeze_Movement_Y(bool bVal);
		void setFreeze_Movement_Z(bool bVal);
		void setFreeze_Rotation_X(bool bVal);
		void setFreeze_Rotation_Y(bool bVal);
		void setFreeze_Rotation_Z(bool bVal);

		// GET
		int getSolid_Type();
		int getMaterial();
		int getDensity();
		int getRigid_Type();
		double getMass();
		bool getCustom_Defined_Inertia_Matrix();
		double* getCentroid();
		double getInertia_Matrix_xx();
		double getInertia_Matrix_yy();
		double getInertia_Matrix_zz();
		double getInertia_Matrix_xy();
		double getInertia_Matrix_xz();
		double getInertia_Matrix_yz();
		double* getLinear_Velocity();
		double* getAngular_Velocity();
		double* getInitial_Euler_Angles();

		int getType_of_Element();
		int getIn_or_Out_Normalvector();
		double* getSpecified_Axis();
		bool getConstrain_DOF();
		bool getFreeze_Movement_X();
		bool getFreeze_Movement_Y();
		bool getFreeze_Movement_Z();
		bool getFreeze_Rotation_X();
		bool getFreeze_Rotation_Y();
		bool getFreeze_Rotation_Z();
    };


	class FITKInterfaceCustomDataAPI FITKCDDataSolidManager : public Core::FITKAbstractDataManager<FITKCDDataSolid>
	{
	public:
		explicit FITKCDDataSolidManager() = default;
		virtual ~FITKCDDataSolidManager() = default;
	};
}

